package com.service.module;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;

public class ModuleDAOHibernate implements ModuleDAO {

	private Session session;

	public void setSession(Session session) {
		this.session = session;
	}

	public List<Module> find(Integer userID) {
		List<Module> listModule = new ArrayList<Module>();
		try {
			Query query = session
					.createSQLQuery(
							"CALL SP_GET_USER_ACCESS(:userID, :parentID)")
					.addEntity(Module.class).setParameter("userID", userID)
					.setParameter("parentID", 0);

			@SuppressWarnings("unchecked")
			List<Module> result = query.list();

			for (int i = 0; i < result.size(); i++) {
				Module module = new Module();
				module.setModuleID(result.get(i).getModuleID());
				module.setName(result.get(i).getName());
				module.setController(result.get(i).getController());
				module.setAction(result.get(i).getAction());
				module.setEnable(result.get(i).isEnable());

				// Listar os submenus
				query = session
						.createSQLQuery(
								"CALL SP_GET_USER_ACCESS(:userID, :parentID)")
						.addEntity(Module.class).setParameter("userID", userID)
						.setParameter("parentID", result.get(i).getModuleID());

				@SuppressWarnings("unchecked")
				List<Module> result2 = query.list();

				List<Module> listSubModule = new ArrayList<Module>();
				for (int x = 0; x < result2.size(); x++) {
					Module subModuleVO = new Module();
					subModuleVO.setModuleID(result2.get(x).getModuleID());
					subModuleVO.setName(result2.get(x).getName());
					subModuleVO.setController(result2.get(x).getController());
					subModuleVO.setAction(result2.get(x).getAction());
					subModuleVO.setEnable(result2.get(x).isEnable());
					subModuleVO.setIcon(result2.get(x).getIcon());
					listSubModule.add(subModuleVO);
				}
				module.setSubModule(listSubModule);
				listModule.add(module);
			}

		} catch (Throwable e) {
			e.printStackTrace();
		}
		return listModule;
	}
}
